#include<bits/stdc++.h>
using namespace std;
struct lrv
{
    int l,r,v;
    bool zx;
}tr[20005];
struct lr
{
    int l_1,r_1;
}f[10005];
bool se[10005];
int t,m,n,k,l0;
int d,v0,l1,a;
int ti;
int num,sum;
void chu()
{
    for(int i=1;i<=l0;i++) se[i]=0;
}
int bu_tr(int pq,int ll,int rr)
{
    tr[pq].r=rr;
    tr[pq].l=ll;
    tr[pq].zx=0;
    if(ll==rr)
    {
        if(se[ll]) tr[pq].v=1;
        else tr[pq].v=0;
        return tr[pq].v;
    }
    else{
        int mid=(ll+rr)/2;
    tr[pq].v=bu_tr(pq*2,ll,mid)+bu_tr(pq*2+1,mid+1,rr);
    return tr[pq].v;
    }

}
int de_tr(int pq,int ll,int rr)
{
    if(tr[pq].r<ll||tr[pq].l>rr) return 0;
    else if(tr[pq].l>=ll&&tr[pq].r<=rr)
    {
        tr[pq].v=1;
        tr[pq].zx=1;
        return tr[pq].v;
    }
    else if(tr[pq].zx)
    {
        tr[pq*2].zx=1;
        tr[pq*2+1].zx=1;
    }
    int lll=de_tr(pq*2,ll,rr),rrr=de_tr(pq*2+1,ll,rr);
    if(tr[pq].zx){
        tr[pq].v=max(lll+rrr,tr[pq].v);
    }
    return lll+rrr;

}
int se_tr(int pq)
{
    if(tr[pq].zx) return tr[pq].v;
    return (se_tr(pq*2)+se_tr(pq*2+1));
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        num=0;sum=0;
        scanf("%d%d%d%d",&n,&m,&l0,&k);
        sum=m;
        if(i-1) chu();
        ti=0;
        for(int j=1;j<=n;j++)
        {
            scanf("%d%d%d",&d,&v0,&a);
            if(a==0&&v0>k)
            {
                f[++ti].l_1=d;
                f[ti].r_1=l0;
            }
            else{
                    l1=((k*k)-(v0*v0))/(2*a);
                    if(a>0)
                    {
                        if(l1<=0)
                        {
                            f[++ti].l_1=d;
                            f[ti].r_1=l0;
                        }
                        else if(d+l1<l0)
                        {
                            if(((k*k)-(v0*v0))/(2*a))
                            f[++ti].l_1=d+l1+1;
                            else
                                f[++ti].l_1=d+l1;
                            f[ti].r_1=l0;
                        }
                        else if(d+l1==l0&&!((k*k)-(v0*v0))/(2*a))
                        {
                            f[++ti].l_1=d;
                            f[ti].r_1=l0;
                        }

                    }
                  if(a<0)
                  {
                      if(d+l1>=l0)
                      {
                          f[++ti].l_1=d;
                            f[ti].r_1=l0;
                      }
                        else if(l1>=0)
                        {
                            f[++ti].r_1=d+l1;
                            f[ti].l_1=d;
                        }
                  }
            }
        }
        for(int j=1;j<=m;j++)
        {
            int xx;
            scanf("%d",&xx);
            se[xx]=1;
        }
        bu_tr(1,1,l0);
        for(int j=1;j<=ti;j++) if(de_tr(1,f[j].l_1,f[j].r_1)) num++;
        sum-=se_tr(1);
        printf("%d ",num);
        printf("%d\n",sum);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
